{
/* Just some sanity to ensure that the scheduler is set up okay. */
ASSERT(current->domain == IDLE_DOMAIN_ID);
- domain_unpause_by_systemcontroller(current);
+ domain_unpause_by_systemcontroller(current->domain);
__enter_scheduler();
/*
---- /home/djm/src/xen/xeno-ia64.bk/xen/linux-2.6.7/include/asm-ia64/system.h 2005-01-23 13:23:36.000000000 -0700
-+++ /home/djm/src/xen/xeno-ia64.bk/xen/include/asm-ia64/system.h 2004-09-17 18:27:22.000000000 -0600
+--- ../../linux-2.6.7/include/asm-ia64/system.h 2005-01-31 11:15:23.000000000 -0700
++++ include/asm-ia64/system.h 2005-03-14 11:31:12.000000000 -0700
@@ -24,8 +24,16 @@
* 0xa000000000000000+2*PERCPU_PAGE_SIZE
* - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page)
#else
# define switch_to(prev,next,last) __switch_to(prev, next, last)
#endif
-+#ifdef XEN
-+#undef switch_to
-+#endif
++//#ifdef XEN
++//#undef switch_to
++//#endif
/*
* On IA-64, we don't want to hold the runqueue's lock during the low-level context-switch,
vector &= ~0xf;
if (vector != IA64_DATA_TLB_VECTOR &&
vector != IA64_DATA_TLB_VECTOR) {
-panic_domain(regs,"psr.ic off, delivering fault=%lx,iip=%p,isr=%p,PSCB.iip=%p\n",
- vector,regs->cr_iip,isr,PSCB(ed,iip));
+panic_domain(regs,"psr.ic off, delivering fault=%lx,iip=%p,ifa=%p,isr=%p,PSCB.iip=%p\n",
+ vector,regs->cr_iip,ifa,isr,PSCB(ed,iip));
}
//printf("Delivering NESTED DATA TLB fault\n");
else {
// should never happen. If it does, region 0 addr may
// indicate a bad xen pointer
+ printk("*** xen_handle_domain_access: exception table"
+ " lookup failed, iip=%p, addr=%p, spinning...\n",
+ iip,address);
panic_domain(regs,"*** xen_handle_domain_access: exception table"
" lookup failed, iip=%p, addr=%p, spinning...\n",
iip,address);
unsigned long itir = vcpu_get_itir_on_fault(ed,ifa);
if (!(psr & IA64_PSR_CPL)) {
- panic_domain(regs,"ia64_handle_reflection: reflecting with priv=0!!\n");
+ printk("ia64_handle_reflection: reflecting with priv=0!!\n");
}
// FIXME: no need to pass itir in to this routine as we need to
// compute the virtual itir anyway (based on domain's RR.ps)
newrrv.rrval = 0;
newrid = ed->domain->starting_rid + rrv.rid;
- if (newrid > ed->domain->ending_rid) return 0;
+ if (newrid > ed->domain->ending_rid) {
+ printk("can't set rr%d to %lx, starting_rid=%lx,"
+ "ending_rid=%lx, val=%lx\n", rreg, newrid,
+ ed->domain->starting_rid,ed->domain->ending_rid,val);
+ return 0;
+ }
memrrv.rrval = rrv.rrval;
if (rreg == 7) {
/* XEN/ia64 INTERNAL ROUTINES */
-unsigned long physicalize_rid(struct exec_domain *ed, unsigned long rid)
+unsigned long physicalize_rid(struct exec_domain *ed, unsigned long rrval)
{
ia64_rr rrv;
- rrv.rrval = rid;
+ rrv.rrval = rrval;
rrv.rid += ed->domain->starting_rid;
return rrv.rrval;
}
unsigned long
-virtualize_rid(struct exec_domain *ed, unsigned long rid)
+virtualize_rid(struct exec_domain *ed, unsigned long rrval)
{
ia64_rr rrv;
- rrv.rrval = rid;
+ rrv.rrval = rrval;
rrv.rid -= ed->domain->starting_rid;
return rrv.rrval;
}
{
unsigned long rr0, rr1,rr2, rr3, rr4, rr5, rr6, rr7;
// TODO: These probably should be validated
+ unsigned long bad = 0;
if (ed->vcpu_info->arch.metaphysical_mode) {
ia64_rr rrv;
set_rr_no_srlz(0x8000000000000000L, rr4);
set_rr_no_srlz(0xa000000000000000L, rr5);
set_rr_no_srlz(0xc000000000000000L, rr6);
+ // skip rr7 when in metaphysical mode
}
else {
- rr0 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[0]);
- rr1 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[1]);
- rr2 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[2]);
- rr3 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[3]);
- rr4 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[4]);
- rr5 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[5]);
- rr6 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[6]);
- set_one_rr(0x0000000000000000L, rr0);
- set_one_rr(0x2000000000000000L, rr1);
- set_one_rr(0x4000000000000000L, rr2);
- set_one_rr(0x6000000000000000L, rr3);
- set_one_rr(0x8000000000000000L, rr4);
- set_one_rr(0xa000000000000000L, rr5);
- set_one_rr(0xc000000000000000L, rr6);
- ia64_srlz_d();
+ rr0 = ed->vcpu_info->arch.rrs[0];
+ rr1 = ed->vcpu_info->arch.rrs[1];
+ rr2 = ed->vcpu_info->arch.rrs[2];
+ rr3 = ed->vcpu_info->arch.rrs[3];
+ rr4 = ed->vcpu_info->arch.rrs[4];
+ rr5 = ed->vcpu_info->arch.rrs[5];
+ rr6 = ed->vcpu_info->arch.rrs[6];
+ rr7 = ed->vcpu_info->arch.rrs[7];
+ if (!set_one_rr(0x0000000000000000L, rr0)) bad |= 1;
+ if (!set_one_rr(0x2000000000000000L, rr1)) bad |= 2;
+ if (!set_one_rr(0x4000000000000000L, rr2)) bad |= 4;
+ if (!set_one_rr(0x6000000000000000L, rr3)) bad |= 8;
+ if (!set_one_rr(0x8000000000000000L, rr4)) bad |= 0x10;
+ if (!set_one_rr(0xa000000000000000L, rr5)) bad |= 0x20;
+ if (!set_one_rr(0xc000000000000000L, rr6)) bad |= 0x40;
+ if (!set_one_rr(0xe000000000000000L, rr7)) bad |= 0x80;
}
- rr7 = physicalize_rid(ed, ed->vcpu_info->arch.rrs[7]);
- set_one_rr(0xe000000000000000L, rr7);
ia64_srlz_d();
+ if (bad) {
+ panic_domain(0,"load_region_regs: can't set! bad=%lx\n",bad);
+ }
}
// context_switch
void context_switch(struct exec_domain *prev, struct exec_domain *next)
{
-printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
-printk("@@@@@@ context switch from domain %d (%x) to domain %d (%x)\n",
-prev->domain->id,(long)prev&0xffffff,next->domain->id,(long)next&0xffffff);
-printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
-if (prev->domain->id == 1 && next->domain->id == 0) cs10foo();
-if (prev->domain->id == 0 && next->domain->id == 1) cs01foo();
+//printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+//printk("@@@@@@ context switch from domain %d (%x) to domain %d (%x)\n",
+//prev->domain->id,(long)prev&0xffffff,next->domain->id,(long)next&0xffffff);
+//printk("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
+//if (prev->domain->id == 1 && next->domain->id == 0) cs10foo();
+//if (prev->domain->id == 0 && next->domain->id == 1) cs01foo();
switch_to(prev,next,prev);
clear_bit(EDF_RUNNING, &prev->ed_flags);
//if (!is_idle_task(next->domain) )
char buf[128];
struct exec_domain *ed = current;
static volatile int test = 1; // so can continue easily in debug
+ extern spinlock_t console_lock;
+ unsigned long flags;
- printf("$$$$$ PANIC in domain %d:",ed->domain->id);
+ printf("$$$$$ PANIC in domain %d (k6=%p): ",
+ ed->domain->id, ia64_get_kr(IA64_KR_CURRENT));
va_start(args, fmt);
(void)vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
+ printf(buf);
if (regs) show_registers(regs);
- while(test);
+ domain_pause_by_systemcontroller(current->domain);
+ //while(test);
}
console_endboot(cmdline && strstr(cmdline, "tty0"));
#endif
- domain_unpause_by_systemcontroller(current);
+ domain_unpause_by_systemcontroller(current->domain);
#ifdef CLONE_DOMAIN0
{
int i;
* indent-tabs-mode: nil
* End:
*/
+
// control flags for turning on/off features under test
-//#undef CLONE_DOMAIN0
-#define CLONE_DOMAIN0 1
-//#undef CLONE_DOMAIN0
+#undef CLONE_DOMAIN0
+//#define CLONE_DOMAIN0 3
#define USER_ACCESS
// manufactured from component pieces